package com.cutJar.core;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;

import com.conf.log.LOG;
import com.conf.log.impl.LogImpl;
import com.cutJar.Exception.CutNullException;
import com.cutJar.Exception.ResourceNullException;
import com.cutJar.util.CharStream;
import com.cutJar.util.CopyFile;
import com.cutJar.util.Resource;

/**
 * <b>生成精简jar rt </b>
 * <p>
 * 注意：<br>
 *  class.txt默认在根目录
 * @author 威 
 * <br>2017年10月7日 下午5:18:21  
 * @since 1.0
 */
/**
 * 
 * 整理日期
 * <br>2018年3月24日 下午2:20:17
 *
 */

public class CutJAR {
	protected String drectoryName = "";	//当前主要剪切文件夹名称
	private String jreDir;			//jre原路径
	private String copyToDir;		//拷贝到某文件夹
	protected int succCount;		//成功拷贝个数
	protected int failCount;		//失败拷贝个数
	private StringBuilder notFound;
	
	public CutJAR(){
	}
	
	/**
	 * 生成到默认的文件夹	默认rt
	 * <p>	
	 * 重载 
	 * @param jreDir
	 * @param copyToDir
	 * @return
	 * @throws CutNullException
	 * CutJAR
	 * @since 1.0
	 */
	public CutJAR configure(String jreDir, String copyToDir) throws CutNullException{
		if(copyToDir.trim().equals("") || copyToDir == null)
			throw new CutNullException("存放剪切文件的目录不能为空：" + copyToDir);
		if(jreDir.trim().equals("") || jreDir == null)
			throw new CutNullException("jre路径不能为空：" + jreDir);
		this.drectoryName = copyToDir.substring(copyToDir.lastIndexOf("\\")+1, copyToDir.length());
		this.copyToDir = copyToDir;
		this.jreDir = jreDir;
		this.succCount = 0;
		this.failCount = 0;
		return this;
	}
	
	/**
	 * 载入配置信息
	 * @see
	 * @param jreDir	jre路径
	 * @param copyToDir	剪切后的jre路径
	 * void
	 */
	/*public BuildJAR setConf(String sourcePath, String targetPath){
		this.setConf(sourcePath);
		this.targetPath = targetPath;
		return this;
	}*/
	
	//生成精简jar
	//对rt进行精简  	默认路径（ystem.getProperte("user.dir")+rt）
		//查找对应的文件   --  是否找到提示
			//找到
				//判断目标目录是否存在所需的文件夹
				//复制
	
			//没找到
				//提示
			
		//CharStream 字符流
	public void cutStart() {
		System.out.println("jre精简开始，当前剪切的是"+drectoryName+"包");
		cutStart_();		//开始精简jre
		logInfor();			//结果打印到日志中
	}
	
	/**
	 * 
	 * 向drectoryName.txt读取class类路径
	 * @see
	 * @throws Exception
	 * void
	 *
	 */
	protected void cutStart_(){
		BufferedReader br = null;
		System.out.println(drectoryName + "-drectoryName");
		try {
			br = CharStream.getRead(Resource.getResource("pre", drectoryName+".txt"));
			notFound = new StringBuilder("\r\n").append("拷贝失败的类文件：");
			//读取SearchTarget处理后的文本
			//样本：java/lang/Object
			doFor(br);
		} catch (Exception e) {
			LogImpl.getInstance().log(LOG.ERROR, e.getMessage());
		}finally{
			try {
				CharStream.free(br);
			} catch (IOException e) {
				LogImpl.getInstance().log(LOG.ERROR, e.getMessage());
			}
		}
		LogImpl.getInstance().log(LOG.ALERT, failCount == 0 ? notFound.append("\r\n").append("			无拷贝失败记录。") : notFound);
	}

	/**
	 * 处理关键字段文本信息并进行class文件的复制
	 * <p>	 
	 * 1、拼接原jre中class文件所在路径<br>
	 * 2、判断1中拼接出来的路径是否有此class文件   	有-进行拷贝		无-提示<br>
	 * 3、拷贝时判断是否存在拷贝所需的路径              	有-直接拷贝过去	无-创建<br>
	 * @param br
	 * @throws IOException
	 * @throws ResourceNullException
	 * void
	 * @see 
	 * @since 1.0
	 */
	protected void doFor(BufferedReader br) throws IOException, ResourceNullException {
		String classData;
		while((classData = br.readLine()) != null) {
			String classDir = null;	//类的路径
			String className = null;//类的名称
			try{
				classDir = classData.substring(0, classData.lastIndexOf("/"));
				className = classData.substring(classData.lastIndexOf("/")+1, classData.length()) + ".class";
			}catch(StringIndexOutOfBoundsException e){
				LogImpl.getInstance().log(LOG.ERROR, e.getMessage());
				return;
			}
			//1
			String sourcePath = Resource.getFileSystemResourceToString(
					jreDir, drectoryName, classDir, className);					//jre里的特定包中的类路径
			File sourceClassFile = Resource.getFileSystemResource(sourcePath);	//类文件
			//2
			//System.out.println(sourceClassFile.toString());
			if(sourceClassFile.exists()){
				//3
				File copyToDectory = Resource.getFileSystemResource(copyToDir, classDir); //目标文件夹
				if(!copyToDectory.exists()) copyToDectory.mkdirs();
				String copyToPath_ = Resource.getFileSystemResourceToString(
						copyToDir, classDir.substring(0, classDir.lastIndexOf("/")), className);	//拷贝到
				try {
					CopyFile.getInstance().copy(sourcePath, copyToPath_);
				} catch (Exception e) {
					LogImpl.getInstance().log(LOG.ERROR, e.getMessage());
					LogImpl.getInstance().log(LOG.ERROR, new StringBuilder("\r\n")
							.append("拷贝异常: ")
							.append("\r\n")
							.append("			原文件：")
							.append(sourcePath)
							.append("\r\n")
							.append("			拷贝到：")
							.append(copyToPath_.toString()));
				}
				succCount++;
			}else{
				failCount++;
				notFound.append("\r\n")
				.append("			")
				.append(sourceClassFile.toString())
				.append("    找不到文件！");
			}
		}
	}

	//精简结果
	protected void logInfor(){
		System.out.println("成功拷贝个数：" +succCount+ "个");
		System.out.println("失败拷贝个数:" +failCount+ "个");
		System.out.println("jre剪切完毕！！！");
		LogImpl.getInstance().log(LOG.ORDINARY, new StringBuilder("\r\n")
				.append("拷贝结果: ")
				.append("\r\n")
				.append("			成功拷贝个数：")
				.append(succCount+"个")
				.append("\r\n")
				.append("			失败拷贝个数:")
				.append(failCount+"个"));
	}
}
